﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _04_自定义定时器实现
{
    internal class MyTimer : Control
    {
        public int Interval { get; set; } = 0; // 自定义间隔时间
        public event Action Tick = () => { }; //  自定义tick 事件
        Task task = null;

        bool StartType = false; // false 关闭状态 

        public MyTimer()
        {
            task = new Task(() =>
            {

                while (StartType)
                {
                    // 异步任务的执行
                    Thread.Sleep(Interval);

                    if (!StartType)
                    {
                        break;
                    }
                    //Tick(); // 间隔时间到达时 触发事件 执行事件绑定的逻辑
                    // tick 事件应该在 主线程中 
                    // 要想使用 Invoke 方法 呢么当前的类必须是 控件 或者窗体 
                    // 此时可以借助于自定义控件来实现  将我们封装的类继承于 Control

                    Invoke(new Action(() =>
                    {
                        //Console.WriteLine("12333333");
                        Tick();
                    }));
                }

            });
        }

        public void Start()
        {
            if (StartType) return;
            StartType = true;
            task.Start(); 
        }

        public void Stop()
        {
            StartType = false;
            
            task = new Task(() =>
            {

                while (StartType)
                {
                    // 异步任务的执行
                    Thread.Sleep(Interval);
                    if (!StartType)
                    {
                        break;
                    }
                    //Tick(); // 间隔时间到达时 触发事件 执行事件绑定的逻辑
                    // tick 事件应该在 主线程中 
                    // 要想使用 Invoke 方法 呢么当前的类必须是 控件 或者窗体 
                    // 此时可以借助于自定义控件来实现  将我们封装的类继承于 Control

                    Invoke(new Action(() =>
                    {
                        Tick();
                    }));
                }

            });
        }
    }
}
